﻿using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Linq;
using System.Web;
using Gestion.Common.Extensions;
using GestionSaludOcupacional.Infrastructure.Mapping;
using GestionSaludOcupacional.Infrastructure.Services;
using GestionSaludOcupacional.Portal.Base.ViewModels;
using GestionSaludOcupacional.Portal.Base.ViewModels.HistoriaClinica;
using GestionSaludOcupacional.Portal.Base.Models;

namespace GestionSaludOcupacional.Portal.App_Start
{
    [Export(typeof(Facade))]
    public class Facade
    {
        public IHealthService HealthService { get; set; }

        public IMappingService MappingService { get; set; }

        [ImportingConstructor]
        public Facade(IHealthService health, IMappingService mapping)
        {
            HealthService = health;
            MappingService = mapping;
        }

        public List<Examen> ObtenerListaExamenes(int userId)
        {
            var fisico = HealthService.ObtenerHistoriaClinicaIndividuo(userId)
                            .MakeEnumerable().Select(x => new Examen { Id = x.Id, FechaCreacion = x.FechaCreacion.ToShortDateString(), IndividuoId = x.IndividuoId, Tipo = "Fisico" });
            var audicion = HealthService.ObtenerExamenAudicionByIndividuo(userId)
                .Select(x => new Examen { Id = x.Id, FechaCreacion = x.FechaCreacion.Value.ToShortDateString(), IdCita = x.IdCita, Tipo = "Audicion", IndividuoId = x.IndividuoId }).ToList();
            var psicologia = HealthService.ObtenerExamenPsicologiaByIndividuo(userId)
                .Select(x => new Examen { Id = x.Id, FechaCreacion = x.FechaCreacion.Value.ToShortDateString(), IdCita = x.IdCita, Tipo = "Psicologia", IndividuoId = x.IndividuoId }).ToList();
            var psicosenso = HealthService.ObtenerExamenPsicosensometriaByIndividuo(userId)
                  .Select(x => new Examen { Id = x.Id, FechaCreacion = x.FechaCreacion.Value.ToShortDateString(), IdCita = x.IdCita, Tipo = "Psicosensometria", IndividuoId = x.IndividuoId }).ToList();
            var vision = HealthService.ObtenerExamenVisionByIndividuo(userId)
                 .Select(x => new Examen { Id = x.Id, FechaCreacion = x.FechaCreacion.Value.ToShortDateString(), IdCita = x.IdCita, Tipo = "Vision", IndividuoId = x.IndividuoId }).ToList();
            var resutl = fisico.Union(audicion).Union(psicologia).Union(psicologia).Union(psicosenso).Union(vision);
            return resutl.ToList();
        }

        public List<Examen> ObtenerCertificados(int pacienteId)
        {
            var registros = HealthService.ObtenerHistoriaClinicaRegistrosByIndividuo(pacienteId).ToList();
            var fisico = registros.Select(historiaClinicaRegistro => new Examen
                                                                         {
                                                                             FechaCreacion = historiaClinicaRegistro.HistoriaClinica.FechaCreacion.ToShortDateString(),
                                                                             Id = historiaClinicaRegistro.Id,
                                                                             IndividuoId = historiaClinicaRegistro.HistoriaClinica.IndividuoId,
                                                                             Tipo = "Fisico",
                                                                             IdCita = historiaClinicaRegistro.IdCita
                                                                         }).ToList();
            var audicion = HealthService.ObtenerExamenAudicionByIndividuo(pacienteId)
                .Select(x => new Examen { Id = x.Id, FechaCreacion = x.FechaCreacion.Value.ToShortDateString(), IdCita = x.IdCita, Tipo = "Audicion", IndividuoId = x.IndividuoId }).ToList();
            var psicologia = HealthService.ObtenerExamenPsicologiaByIndividuo(pacienteId)
                .Select(x => new Examen { Id = x.Id, FechaCreacion = x.FechaCreacion.Value.ToShortDateString(), IdCita = x.IdCita, Tipo = "Psicologia", IndividuoId = x.IndividuoId }).ToList();
            var psicosenso = HealthService.ObtenerExamenPsicosensometriaByIndividuo(pacienteId)
                  .Select(x => new Examen { Id = x.Id, FechaCreacion = x.FechaCreacion.Value.ToShortDateString(), IdCita = x.IdCita, Tipo = "Psicosensometria", IndividuoId = x.IndividuoId }).ToList();
            var vision = HealthService.ObtenerExamenVisionByIndividuo(pacienteId)
                 .Select(x => new Examen { Id = x.Id, FechaCreacion = x.FechaCreacion.Value.ToShortDateString(), IdCita = x.IdCita, Tipo = "Vision", IndividuoId = x.IndividuoId }).ToList();
            var resutl = fisico.Union(audicion).Union(psicologia).Union(psicologia).Union(psicosenso).Union(vision);
            return resutl.ToList();
        }

        public bool GuardarHistorial(HistoriaClinicaRegistroViewModel historia)
        {
            if (!(historia.HistoriaClinicaId > 0))
            {
                var model = MappingService.GetModel(historia);
                historia.HistoriaClinicaId = HealthService.CrearHistoriaClinica(model);
            }

            var incidentemodel = MappingService.GetModelRegistro(historia);
            if (historia.Id > 0)
                return HealthService.ActualizarIncidenteHistoria(incidentemodel);
            return HealthService.CrearIncidenteHistoria(incidentemodel);
        }

        public IEnumerable<IndividuoViewModel> GetIndividuos(string id, string apellido)
        {
            var nId = id.SafeParse(0);
            var individuos = HealthService.ObtenerIndividuos().ToArray();
            if (nId > 0)
                individuos = individuos.Where(x => x.NoIdentificacion.Equals(nId)).ToArray();
            individuos = individuos.Where(x => (x.PrimerApellido.StartsWith(apellido.IgnoreNull(), StringComparison.OrdinalIgnoreCase))).ToArray();
            return MappingService.GetViewModel(individuos).OrderByDescending(x => x.IndividuoId).ToArray();
        }

        public bool GuardarIndividuo(IndividuoViewModel individuo)
        {
            var model = MappingService.GetModel(individuo);
            //TODO:Agregar id de la session del usuario actual.
            //model.UsuarioCreacion = int session
            if (individuo.IndividuoId == 0)
                return HealthService.CrearIndividuo(model);

            return individuo.IndividuoId > 0 && HealthService.ActualizarIndividuo(model);
        }

    }

}